package cn.felord.boot;

import java.util.ArrayDeque;
import java.util.Deque;

public class SimplifyPath {

    /**
     * 简化路径
     * 栈用来维护路径中的目录，将路径以"/"进行分割，我们会得到“.”、“..”、“路径”和“ ”四种
     * 其中因为“..”表示上级路径，因此如果栈顶有元素的话，要将其弹出，表示切换到上级目录
     * 至于“.”，因为表示的是当前目录，实际上和“ ”一样没有什么作用，直接无视掉就好了
     * 最后栈中剩下的元素，再使用"/"拼接回去，就大功告成了。
     *
     * @param path
     * @return
     */
    public static String simplifyPath(String path) {
        String[] names = path.split("/");
        Deque<String> stack = new ArrayDeque<String>();
        for (String name : names) {
            //如果是..
            if ("..".equals(name)) {
                if (!stack.isEmpty()) {
                    //移除队列最后一个元素
                    stack.pollLast();
                }
            } else if (name.length() > 0 && !".".equals(name)) {
                //将元素栈插入尾部
                stack.offerLast(name);
            }
        }
        StringBuffer ans = new StringBuffer();
        if (stack.isEmpty()) {
            ans.append('/');
        } else {
            //拼接路径
            while (!stack.isEmpty()) {
                ans.append('/');
                ans.append(stack.pollFirst());
            }
        }
        return ans.toString();
    }

    public static void main(String[] args) {
        String path = "/home/user/Documents/../Pictures";
        System.out.println(simplifyPath(path));
    }
}
